home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / asmgen2.arc / ASMGEN.DOC < prev   
Text File  |  1984-04-10  |  26KB  |  595 lines

  1.  
  2. ************************************************************************
  3. *                                                                      *
  4. *   ASMGEN.COM - by J. Gersbach   and  J. Damke    (Ver. 2.01)         *
  5. *                                                                      *
  6. *   A program to generate cross-referenced assembly language code      *
  7. *   from any executable file.                                          *
  8. *                                                                      *
  9. *                                                                      *
  10. *                                                                      *
  11. *   Uploaded to PCanada by Mark Magner   November 23, 1983             *
  12. *                                                                      *
  13. ************************************************************************
  14.  
  15.  
  16.  
  17. *  PREFACE  *
  18.  
  19.  
  20. This program will generate 8086/87/88 assembly code text
  21. that is compatible with the IBM Personal Computer Macro
  22. Assembler from any executable diskette file up to 65,535
  23. bytes.  The output can be routed to the console or a disk-
  24. ette file.  A reference list may be generated separately or
  25. embedded at the appropiate instruction counter address in
  26. the assembly code.
  27.  
  28. Some manual touch up will be required before reassembly, but
  29. nearly all the typing is done for you by ASMGEN and anything
  30. questionable is marked with "??".
  31.  
  32. A file of sequential instructions may be resident on the
  33. same diskette to indicat to ASMGEN which addresses contain
  34. code, byted, words, or strings.  This file may also include
  35. instructions to assume segment register values or toggle the
  36. output of assembley code text, generation of the reference
  37. table, 8087 mnemonics, of the inclusion of embedded reference
  38. information in the assembly file.
  39.  
  40. DEBUG may be used to browse through the executable file to
  41. determine the starting locations of code and data to develop
  42. the sequential instruction file.  It is important to accu-
  43. rately specify these locations for an accurate reference
  44. tabel and minimum touching up of the ASM output text.
  45.  
  46. The number of references within the file determines the amount
  47. of memory required since a reference tabel is built in
  48. memory during the first pass.  Disassembly is done from disk
  49. and only one file sector is in memory at any given time.
  50. Therefore memory size does not limit the size of the file
  51. to be disassembled.  48K bytes of memory will be enough for
  52. most programs but a few will need 64K or 128K.  One diskette
  53. drive is sufficient but two is more convenient.
  54.  
  55.  
  56. *  STARTING ASMGEN  *
  57.  
  58. There are two ways to work with ASMGEN:  either by using the
  59. command menu or by calling ASMGEN with parameters.
  60. Following are the descriptions of both options.
  61.  
  62. *  USING THE ASMGEN MENU  *
  63.  
  64. The program is invoked by typing:  ASMGEN
  65.  
  66. You are then prompted for a file specification.  Respond with
  67. the name of the executable file from which you wish to
  68. generate the assembly code.  The executable file will normally
  69. have an extension of .EXE or .COM.  ASMGEN will check this
  70. file spec for validity and then respond with a prompt that
  71. includes a summary of the command letters indicating that
  72. you may give it a command.  The executable file contents
  73. are not checked for valid code and ASMGEN will try to dis-
  74. assemble text or compressed BASIC files and produce unintell-
  75. igible assembly code.
  76.  
  77. The commands are:
  78.  
  79. X filespec      This file spec replaces any previous executable
  80.                 file spec.  The usual file extension is .COM
  81.                 or .EXE
  82.  
  83.                 EXAMPLE:  X DATE.COM
  84.  
  85.  
  86. A <filespec>    The executable file is disassembled and the assem-
  87.                 bly code is routed to the specified file.  The
  88.                 usual file extension is .ASM.  If the filespec is
  89.                 omitted, the output will default to the console.
  90.  
  91.                 EXAMPLE:  A DATE.ASM
  92.  
  93. R <filespec>    The reference table is sent to the file specified.
  94.                 The usual file extension is .TBL.  If the filespec
  95.                 is omitted, the output will default to the console.
  96.  
  97.                 EXAMPLE:  R DATE.TBL
  98.  
  99. Q               The program is terminated and control returned to
  100.                 DOS.
  101.  
  102.  
  103. Each time a command has been executed, ASMGEN waits with a one line
  104. prompt for the next command.
  105.  
  106. X <filespec>, A <CON>, R <CON> or Q ?
  107.  
  108. The default filespec for each command is shown in brackets.  Enter
  109. the next command of your choice as described above.
  110.  
  111.  
  112. *  USING ASMGEN WITH PARAMETER CALLS  *
  113.  
  114. Up to three file specifications may be included when ASMGEN is
  115. first called from DOS.  The executable file's name is given first,
  116. followed by specifications for the assembly and reference table
  117. files.
  118.  
  119. EXAMPLE:  ASMGEN DATE.COM, DATE.ASM, DATE.TBL
  120.  
  121. If a semicolon follows the last filespec, ASMGEN will exit to DOS
  122. when the command has been executed.  If no semicolon is entered,
  123. ASMGEN will display the menu options described above and wait for
  124. further input after executing the command.
  125.  
  126. EXAMPLE:  ASMGEN DATE.COM, DATE.ASM;
  127.  
  128. If the filespec for the .ASM file and/or .TBL file is omitted,
  129. ASMGEN will generate first the .ASM file, then a .TBL file using
  130. the filename of the first filespec.
  131.  
  132. EXAMPLE:  ASMGEN DATE.COM,,; creates DATE.ASM and DATE.TBL and exits
  133.                              to DOS.
  134.  
  135. If only the reference table is desired, the dummy name NUL should be
  136. entered in place of an .ASM filespec
  137.  
  138. EXAMPLE:  ASMGEN DATE.COM, NUL, DATE.TBL
  139.  
  140. If only one filespec is given when the program is called, the reference
  141. table is built in memory and then the menu options are displayed for
  142. further commands.
  143.  
  144. EXAMPLE:  ASMGEN DATE.COM
  145.  
  146.  
  147. *  PROGRAM EXECUTION  *
  148.  
  149. The disassembly is done in two passes through the scource file.  On pass
  150. #1, the reference table is built in memory and the actual output is gen-
  151. erated during pass #2.  Once the reference table is established, it remains
  152. in memory until an X or Q command is issued, and subsequent A and R com-
  153. mand executions skip pass #1.  This saves a lot of time when the executable
  154. file is large.
  155.  
  156. Three contiguous data areas are built dynamically in memory during pass #1.
  157. First is the compressed sequential instruction list.  Second is a list of
  158. pointers for .EXE files that point to the locations of all relocatable
  159. variables in the program, also arranged in numerical order.  These are
  160. established before reading any code.  Third, the reference table is then
  161. built in a higher area of memory as pass #1 progresses.
  162.  
  163. If all available memory in the program segment is filled before the first
  164. two data areas are completed, ASMGEN will abort to the command prompt.
  165. After the reference table is started, a shortage of memory will produce
  166. the message "Reference Table Incomplete Due to Insufficient Memory" and
  167. continue.
  168.  
  169. Ctrl-Break may be used at any time to interrupt a command in progress.
  170.  
  171.  
  172. *  READING THE ASSEMBLY CODE FILE (.ASM)  *
  173.  
  174. This file begins with a title taken from the executable file's name and
  175. date followed by the current date (in brackets).
  176.  
  177. If not inhibited by the  M  switch in a SEQ file (explained later), the macro
  178. library will appear next in the file.
  179.  
  180. Next will be a .RADIX 16 pseudo-op which tells the macro assembler that all
  181. numbers are in hexadecimal form.
  182.  
  183. Then comes a header that indicates a starting value for the code segment,
  184. stack segment, instruction pointer and the stack pointer.  The stack pointer
  185. is usually set to FFFF for .COM files but may be somewhat less depending on
  186. available memory.  These values are passed by the linker for .EXE files.
  187.  
  188. The first ASSUME statement might come next.  There is one generated for each
  189. segment that begins with code.  All segment registers are designated according
  190. to the current set of ASSUMEs.  They will sometimes be incorrect, so all
  191. ASSUME statements should be checked prior to re-assembly.
  192.  
  193. The disassembled output follows, terminated by an END statement and the
  194. execution address.  An ORG psuedo-op is included if required.
  195.  
  196. The text is compatible with the IBM Macro Assembler and the format is the same
  197. except for RETurns.  To avoid the need for PROCedure titles, special mnemonics
  198. are provided for all RET instructions.  These are defined in the macro library
  199. at the beginning of the file.  Only macros that are needed for the current file
  200. are produced.  The optional embedded commands that make up the reference table
  201. enhance the readability of the file.  For very large files, this is sometimes
  202. undesirable and a separate reference table is best.
  203.  
  204. When invalid instructions are encountered in code areas, they are reproduced
  205. as byte values followed by "??".  If a near jump is defined previously in the
  206. code, and it is within range of a short jump, a NOP instruction is inserted
  207. after the jump.  The executable file created with this .ASM file and the
  208. Macro Assembler and Linker will then be the same length as the original file.
  209. This makes it less important to differentiate between labels and numeric
  210. constants since the label values and their offsets within the file will be
  211. the same.  The fundamental problem of disassembly is in knowing if the
  212. original assembly code defined a number as a label which changes as a function
  213. of it's position or as a number that always remains the same.  If you make
  214. changes in the assembly code however, you must properly specify all values.
  215. You might as well remove all NOPs at the same time.
  216.  
  217. Labels are five characters long and begin with "L".  Segment labels begin with
  218. "S".  The remaining characters are the current instruction counter in hex
  219. form, thus making each label unique and showing it's location in the original
  220. file.  The instruction counter is continuous throughout the assembly code
  221. without resetting at segment boundaries.  The segment labels are then in byte
  222. as opposed to paragraph form.  In those cases where a label value is modified
  223. by an ASSUME statement, the original value is included as a comment in the
  224. referencing instruction so that it may be easily changed back if it was not
  225. intended as a location.
  226.  
  227. The word "Relocatable" is printed at the end of any line that contains an
  228. ablolute paragraph value.  These are values that DOS modifies after loading but
  229. befor executing a program.  They are used for loading segment registers that
  230. are sensitive to the program location in menory.  Relocatable values are not
  231. modified by ASSUMEs.  ASMGEN converts these numbers from paragraph to byte
  232. values by multiplying them by sixteen so that they will fit within the 16-bit
  233. instruction counter field.  When the paragraph value is negative or exceeds
  234. 0FFFH, it is left unchanged and a warning (??) is issued on that line.  When
  235. a program larger than 64K bytes is being disassembled, it should be divided
  236. into smaller files.
  237.  
  238. All words are produced as labels, except when the "L" switch has been enacted
  239. in the .SEQ file (explained later).  The label name indicates it's numeric
  240. value and, if it does not occur on an instruction boundary, the name indicates
  241. it's position relative to the current instruction pointer is given by an EQU
  242. statement.  Therefore the Macro Assember will assume that it is a location,
  243. but it is easily changed to a constant since the value is given in the label
  244. name.  The word OFFSET precedes a label whenever it is questionable whether
  245. it is a label or an immediate value.  You must decide which of the labels
  246. should be constants and which of the constants should be labels, and change
  247. them accordingly.  When changing labels to numbers, be sure to append an
  248. "H" if the number ends with a "D" or a "B" since the Macro Assembler will
  249. otherwise assume that it is decimal or binary.
  250.  
  251. Bytes are always treated as constants.  An optional switch may be included in
  252. the .SEQ file (explained later) which enables numbers instead of labels if all
  253. references to the value are data segment and immediate operation types.
  254.  
  255. An effective procedure to follow in attempting to understand the assembly code
  256. file is to look first for the message text area, the input commands, and the
  257. simpler subroutines.  Then add label names to addresses in the .SEQ file
  258. (explained later) that remind the you of their purpose.  Add comments to the
  259. labels.  If these names are well chosen, the larger routines eventually will
  260. become clear.  The embedded references are produced as labels so they will
  261. retain their meanings as they are changed.
  262.  
  263. It is also helpful to spend some time studying the structure of data areas.
  264. Vector tables, which are frequently used to control the program's flow, reveal
  265. the program's structure very quickly.  If some routines do not have labels at
  266. the beginning, it is usually because the code or tables that reference them
  267. (or the segment register assumptions) are not properly defined in the .SEQ
  268. file.
  269.  
  270.  
  271. *  READING THE REFERENCE TABLE (.TBL)  *
  272.  
  273. A referencee is defined as a number that is referenced somewhere in the
  274. program.  It may be a program loaction or a numeric constant.
  275.  
  276. A referencor is is defined as the address in the program from which a refer-
  277. ence is made to the referencee.
  278.  
  279. Each entry is composed of a referencEE  followed by a list of referencors.  If
  280. more than one line is needed, additional lines are indented to the first
  281. referencor position.  The referencEE is followed by an "S" if it includes
  282. references to the beginning of segment.  The referencor is followed by two
  283. letters, the first of which represents the segment register that is implied
  284. or prefixed in the referencing instruction.  The second letter indicates the
  285. type of operation on the referencEE.  When the reference entries are embedded
  286. in the assembly code, all values are preceded with the letter "L".
  287.  
  288. ----------------------------------------------------------------------------
  289. 1st letter      |  2nd letter
  290. SEG REGISTER    |  TYPE OF OPERATION
  291. ----------------------------------------------------------------------------
  292. C  code         |  J  jump         M  modify - INC, ADD, etc.
  293. S  stack        |  C  call         I  immediate - value or offset
  294. D  data         |  R  read         T  test or compare
  295. E  extra        |  W  write        ?  unknown or ESC instruction
  296.                 |  P  port
  297. ----------------|-----------------------------------------------------------
  298.  
  299.  
  300.  
  301. *  WRITING/READING THE SEQUENTIAL INSTRUCTION FILE (.SEQ)  *
  302.  
  303. The sequential instruction file is a list of special instructions to ASMGEN
  304. which the user creates.  The file takes the form of a list of hexadecimal
  305. addresses and single-letter instructions or generation switches.  If used,
  306. the .SEQ file must be on the same diskette as the source file and have the
  307. same name as the source file with an extension of .SEQ.  Each instruction in
  308. the file must be in one of the following formats:
  309.  
  310. addr    command
  311. or
  312. addr    command         ;comment
  313. or
  314. addr    command         label   comment
  315. or
  316. addr    command         label   comment ;comment
  317.  
  318. "addr" represents the instruction pointer value.  All addr values must be in
  319. numerical sequence in the file.
  320.  
  321. "command" may be either a toggle switch or a generation instruction.
  322.  
  323. "label" is optional and replaces the label generated for this address with
  324. this non-blank string.
  325.  
  326. "comment" is optional and must be preceded by "label" unless the dummy label
  327. "." is used.  Everything following "label" is treated as an address comment
  328. and will be printed in the ASM file behind the generated instruction.  The
  329. address comment may be up to 255 characters in length and should not contain
  330. a semi-colon.
  331.  
  332. ";comment" is optional.  Anything following a semi-colon in the .SEQ file
  333. instructions is considered as a comment in the .SEQ file only and is not added
  334. to the generated .ASM file.
  335.  
  336. "label" and "comment" are not allowed when a generation switch is coded, but
  337. a ";comment" may be used to help clarify the .SEQ file.
  338.  
  339. The .SEQ file is read into memory before the first pass starts.  The addresses
  340. and commands will be compressed, but "label" and "comment" will be held in
  341. memory one to one.  An effect of this is that memory space required for dis-
  342. assembly increases with each "label" and "comment" added to the .SEQ file.
  343.  
  344.  
  345. *  DESCRIPTION OF GENERATION SWITCHES  *
  346.  
  347. THE VARIOUS TOGGLE SWITCHES ARE SET TO ON BY DEFAULT.  Switches may be toggled
  348. on and off at any point in the .SEQ file/disassembly.
  349.  
  350. All options switches except /M and /H can be either toggled or directly set by
  351. the user.  A suffix of "+" turns the switch ON, and a suffix of "-" turns the
  352. switch OFF.  Switches encountered in the file that have neither of these
  353. suffixes are toggled to the opposite of their state at the time; ON switches
  354. are turned OFF and OFF switches are turned ON.
  355.  
  356. /B - generate byte references
  357.  
  358. When ON, byte and word references are included in the reference table.  When
  359. OFF, only word references are generated.
  360.  
  361. /E - embedded references in ASM file
  362.  
  363. When ON, reference table entries are inserted in the text just before the
  364. referencee's definition statement.  When OFF, these entries are not included
  365. with the disassembled text.  The entire reference table can be printed with
  366. the "R" command.
  367.  
  368. /F - 8087 mnemonics
  369.  
  370. When ON, ESC instructions are produced.  When OFF, ESC instructions are assumed
  371. to be 8087 instructions and 8087 mnemonics are produced.
  372.  
  373. /H - append hex "H"
  374.  
  375. When this switch appears at any point in the .SEQ file, an "H" is appended to
  376. all hex numbers.  This does not, of course, apply to the labels which are
  377. hex values preceded by the letter "L".  The .RADIX 16 pseudo-op is omitted
  378. which allows the assembler's radix to default to decimal.  This switch defaults
  379. to NO H APPEND.  Note that it will be set only once.  It retains it's value
  380. until the next .SEQ file is read.
  381.  
  382. /L - generate label or number
  383.  
  384. When ON, all word references are treated as labels.  When OFF, a word reference
  385. is treated as a constant if all referencors are data immediate types.
  386.  
  387. /M - suppress macro library
  388.  
  389. When this switch appears at any point in the .SEQ file, no macro library is
  390. included in the text output.  The DEFAULT IS THAT THE MACRO LIBRARY WILL BE
  391. INCLUDED.  Note that this switch will be set only once.  It retains it's
  392. value until the next .SEQ file is read.
  393.  
  394. /O - control ASM output
  395.  
  396. When ON, ASMGEN will output the generated text.  When OFF, output will be
  397. suppressed.
  398.  
  399. /R - control TBL output
  400.  
  401. When ON, ASMGEN will output the generated reference data.  When OFF, the
  402. reference table is not printed.
  403.  
  404. /T - control trace output
  405.  
  406. When ON, up to 16 bytes of object code are included as comments in each line
  407. of the assembly code file.  When OFF, object code is not included.
  408.  
  409.  
  410. *  DESCRIPTION OF .SEQ FILE COMMANDS  *
  411.  
  412. A - assume
  413.  
  414. The following lines contain ASSUMptions for segment register values.  They
  415. become effective at the address specified by this instruction and may be
  416. modified anywhere in the disassembly.  The required format for assumptions is:
  417.  
  418. & 0400  DS
  419.  
  420. The ampersand indicates a continuation of the A instruction.
  421.  
  422. In this example, a data segment beginning at a instruction pointer value of
  423. 400 will be assumed until another  A  instruction changes it.  CS, ES, and
  424. SS are also supported.  The segment assumptions are used for effective address
  425. calculations only.  The code segment assumption does not affect the instruction
  426. pointer value.
  427.  
  428. B - bytes
  429.  
  430. The bytes encountered in the source file are assumed to have meaning as single
  431. byte values.
  432.  
  433. C - code
  434.  
  435. The bytes encountered in the source file are assumed to be valid 8088 machine
  436. language instructions.
  437.  
  438. D - generate data operand
  439.  
  440. The operand of the instructions is changed to immediate data.  Subsequent bytes
  441. are interpreted as "C" (code follows).
  442.  
  443. I - initial value for IP
  444.  
  445. The hexadecimal value on this line overrides the instruction pointer value at
  446. the beginning of the file - not to be confused with the address at which
  447. execution begins.  The default values are 0000 for EXE files and 0100H for COM
  448. and other files.  The execution address following the END statement is omitted
  449. if this option is invoked.
  450.  
  451. S - strings
  452.  
  453. The bytes encountered in the source file are assumed to form text.  Quoted text
  454. is produced for valid ASCII characters and byte values for others.
  455.  
  456. # - defined length strings
  457.  
  458. The first byte encountered in the source file contains the length of the
  459. character string which begins with the next encountered character.  This length
  460. value may be overridden by a subsequent SEQ file instruction.
  461.  
  462. $ - defined length strings
  463.  
  464. The first byte encountered in the source file contains the length of the
  465. character string which begins with the next encountered character plus the
  466. length byte itself.  This length value may be overridden by a subsequent SEQ
  467. file instruction.
  468.  
  469. W - words
  470.  
  471. Pairs of bytes encountered in the source file are assumed to have meaning
  472. as word values.
  473.  
  474. X - repeating data structure
  475.  
  476. A cyclic data structure is assumed to begin at the specified instruction
  477. pointer value.  The structure definition may follow and is prefixed by
  478. an ampersand (&) to indicate the continuation of this instruction.  If the
  479. definition does not follow, then the most recent definition is used.  If no
  480. structure is yet defined, then an error message is displayed.
  481.  
  482. The following elements may be used to define the structure:
  483.  
  484. & NNNN S  -  The next NNNN bytes are defined as string characters
  485. & NNNN B  -  The next NNNN bytes are defined as byte values
  486. & NNNN W  -  The next NNNN bytes are defined as word values
  487. & XXNN $  -  The next sequence of bytes is defined as NN fields.  Each field
  488.              consists of a length byte and a string of characters.  The length
  489.              of each field is contained in the first encountered byte.  The
  490.              high nibble (XX), if non-zero, is a bit mask of the length field
  491.              within the byte.  The length field is right-justified within the
  492.              byte after the byte value is sent to the output file.
  493.  
  494.  
  495.  
  496. *  EXAMPLES OF .SEQ COMMANDS  *
  497.  
  498. This example .SEQ file shows all the possible instructions in the appropriate
  499. format.
  500.  
  501. ;All switches are on at the beginning.
  502. 0       /T      ;no object code as comments in output
  503. 0       /M      ;no macro library in output
  504. 0       /H      ;append "H" to all numbers
  505. 00H     /A      ;assume the following segment values
  506. ;Note that the ampersand (&) indicates the extended ASSUME
  507. & 380   DS      ;the data segment starts at 380 hex
  508. & 380   ES      ;the extra segment starts at 380 hex
  509. 0200     I      ;initialize the instruction pointer to 200
  510. 0200    /F      ;introduce 8087 mnemonics (not ESC)
  511. 0200    /E      ;no embedded references
  512. 0200     C      ;code begins at 200
  513. 0203H    W      ;words are at 203
  514. 0207     C      ;more code starting here
  515. 220      X      ;complex data structure begins here
  516. & 3      W      ;words
  517. & 1      B      ;byte
  518. & 0E02   $      ;2 strings starting with the 2nd byte follow
  519.                 ;bits 3,2,1 of the first byte contain the length of the
  520.                 ;string including the length byte.
  521.                 ;the high nibble (0E) is the mask.
  522.                 ;see also # in summary below
  523. & 1      B      ;byte
  524.                 ;the structure repeats until 351
  525. 351      B      ;bytes
  526. 358      C      ;more code
  527. 380      S      ;strings - list of messages
  528. 421      W      ;words
  529. 4FD     /B      ;no further byte references
  530. 502     /R      ;garbage here - turn off reference generation
  531. 502     /O      ;and output
  532. 600H    /O+     ;valid code - turn output back on
  533. 600     /R
  534. 600      C
  535. 1A60    /O-     ;output file about to fill diskette - turn output off but keep
  536.                 ;scanning for references.
  537.                 ;another run will be needed to get the remaining code.
  538. 1B00    /D      ;treat operand as immediate data
  539. 1DFD    /B+     ;continue with byte references
  540. 1F45     W      user_prt        ;user provided labels will translate
  541. 2256     S      $MSG            ;to upper case
  542.  
  543.  
  544. Comments may be included if preceded by a semicolon.
  545.  
  546. Alphabetic characters may be either upper or lower case.
  547.  
  548. An "H" may follow the hex address.
  549.  
  550.  
  551.  
  552. *  SAMPLE SESSION  *
  553.  
  554. The external command CHKDSK.COM will serve as an example for this sample
  555. session because it is short.  The .SEQ file is also short and easy to generate.
  556. Only these few instructions are needed.
  557.  
  558.  
  559. 0100  /T  ;include object code as comments in .ASM file
  560. 0100  /E  ;simpler output without references
  561. 04F7H  S  ;messages
  562. 04F7H /H  ;append "H" to numeric values
  563.  
  564. Using DEBUG, browse through CHKDSK.COM to see how this was arrived at.
  565. Usually, but not always, the best procedure is to assume code.  If the code
  566. appears unintelligible, display it in hex/ASCII.  If it is not text, assume
  567. bytes.  Label positions in the first disassembly may indicate that some
  568. locations should be words.  Next, generate the .ASM file by typing
  569.  
  570. ASMGEN CHKDSK.COM <enter>
  571. A                 <enter>
  572.  
  573. The assembly code can be viewed on the screen.  Then type
  574.  
  575. A CHKDSK.ASM      <enter>
  576.  
  577. to save the assembly source code to a file.  Then,
  578.  
  579. R CHKDSK.TBL      <enter>
  580.  
  581. to save the cross-reference table to disk.
  582.  
  583. The Macro Assembler, Link.exe and Exe2bin could now be used to assemble
  584. CHKDSK.ASM, link it to .EXE and convert it to a .COM file.  No modification
  585. should be necessary in this case.
  586.  
  587. If working with code that is to be modified, the symbol types must be correctly
  588. specified as locations or as constants.  If they are constants, place them
  589. outside of any segment.  The label names may then be changed to make the code
  590. more readable.
  591.  
  592.  
  593. ENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDENDEND
  594. END OF TRANSFER - PRESS ENTER TO RETURN TO MENU
  595.